-- 这段代码实现了对LuaSnip插件的配置和键位映射，包括加载Lua和VSCode代码片段，设置代码片段的跳转和选择配置，以及相关的键位绑定.
-- 尝试加载所需的模块
local luasnip = pRequire("luasnip")
local types = pRequire("luasnip.util.types")
local cfg = pRequire("guru").config.cmp
local pathUtils = require("guru.utils.path")

-- 如果加载失败，则直接返回
if not luasnip or not types then
  return
end

-- 加载自定义的 Lua 代码片段
pRequire("luasnip.loaders.from_lua").load({
  paths = pathUtils.join(pathUtils.getConfig(), "lua", "guru", "cmp", "snippets", "lua"),
})

-- 延迟加载自定义的 VSCode 代码片段
pRequire("luasnip.loaders.from_vscode").lazy_load({
  paths = pathUtils.join(pathUtils.getConfig(), "lua", "guru", "cmp", "snippets", "vscode"),
})

-- 延迟加载 friendly-snippets 代码片段库
-- 参考：https://github.com/rafamadriz/friendly-snippets/
pRequire("luasnip.loaders.from_vscode").lazy_load()

-- 配置 luasnip 的行为
luasnip.config.set_config({
  history = true, -- 启用历史记录，允许回溯至之前的片段状态
  update_events = "TextChanged,TextChangedI", -- 设置触发片段更新的事件
  enable_autosnippets = true, -- 开启自动触发代码片段
  -- 配置扩展选项，包括 choiceNode 活跃时的视觉提示
  ext_opts = {
    [types.choiceNode] = {
      active = {
        -- 被注释掉的是另一种视觉提示选项
        -- virt_text = { { "choiceNode", "Comment" } },
        virt_text = { { "<--", "Error" } }, -- 错误类型提示
      },
    },
  },
})

-- 键位映射，跳转到下一个代码片段
keymap({ "i", "s" }, cfg.keys.snip_jump_next, function()
  if luasnip.jumpable(1) then
    luasnip.jump(1)
  end
end)

-- 键位映射，跳转到上一个代码片段
keymap({ "i", "s" }, cfg.keys.snip_jump_prev, function()
  if luasnip.jumpable(-1) then
    luasnip.jump(-1)
  end
end)

-- 键位映射，选择下一个代码片段选择项
keymap({ "i", "s" }, cfg.keys.snip_next_choice, function()
  if luasnip.choice_active() then
    luasnip.change_choice(1)
  end
end)

-- 键位映射，选择上一个代码片段选择项
keymap({ "i", "s" }, cfg.keys.snip_prev_choice, function()
  if luasnip.choice_active() then
    luasnip.change_choice(-1)
  end
end)
